import parseAttrs from './parseAttrs'

export default function (templatestr) {
  // 开始，比如<h1>,<div>
  // const startRegExp = /^\<([a-z]+[1-6]?)\>/
  // 因为要考虑属性，所以还要捕获属性列表：非空的非<字符
  const startRegExp = /^\<([a-z]+[1-6]?)(\s[^\<]+)?\>/
  // 结束，比如</h1>，</div>
  const endRegExp = /^\<\/([a-z]+[1-6]?)\>/
  // 必须是开始结束之间的文字
  const wdRegExp = /^([^\<]+)/
  let idx = 0
  let rest = ''

  let stk1 = [], stk2 = [{ children: [] }]
  
  while (idx < templatestr.length - 1) {
    rest = templatestr.substr(idx)
    if (startRegExp.test(rest)) {
      // 开始标签
      let tag = rest.match(startRegExp)[1]
      // 元素属性attribute列表
      let attrstr = rest.match(startRegExp)[2]
      // 这个标签入栈，同时入栈一个对象
      stk1.push(tag)
      stk2.push({ tag, children: [], attrs: parseAttrs(attrstr?.trim()) })

      const attrsLen = attrstr != undefined ? attrstr.length : 0
      idx += tag.length + 2 + attrsLen
    } else if (endRegExp.test(rest)) {
      // 结束标签
      let tag = rest.match(endRegExp)[1]
      // 先是第一个栈弹栈
      let pop_tag = stk1.pop()
      // 注意，此时的标签一定和栈顶一致
      if (tag == pop_tag) {
        let pop_arr = stk2.pop()
        if (stk2.length > 0) {
          stk2[stk2.length - 1].children.push(pop_arr)
        }
      } else {
        throw new Error('Wrong')
      }

      idx += tag.length + 3
    } else if (wdRegExp.test(rest)) {
      // 标签内的文字
      let wd = rest.match(wdRegExp)[1]
      // 排除空字符串，事实上浏览器的确不会解析空字符串
      if (!/^\s+$/.test(wd)) {
        stk2[stk2.length - 1].children.push({ text: wd, type: 3 })
      }
      idx += wd.length
    } else {
      idx++
    }
  }
  
  return stk2[0].children[0]
}
